import vnode from './vnode.js';
// 编写一个低配版本的h函数，这个函数必须接受3个参数，缺一不可
// 相当于它的重载功能较弱
// 也就是说，调用的时候形态必须是下面的三种之一
// h('div',{},'文字')
// h('div',{},[])
// h('div',{},h())
// export default function (sel, data, c) {
//   // 检查参数个数
//   if (arguments.length !== 3)
//     throw new Error('h函数必须传入3参数')

//   // 检查参数c的类型
//   if (typeof c === 'string' || typeof c === 'number') {
//     return vnode(sel, data, undefined, c, undefined);
//   } else if (Array.isArray(c)) {
//     if (c.length === 0)
//       throw new Error('在数组中填写h函数');
//     let children = [];
//     for (let i = 0; i < c.length; i++) {
//       if (!(typeof c[i] === 'object' && c[i].hasOwnProperty('sel'))) {
//         throw new Error('数组中不是h函数');
//       }
//       // 这里不用执行c[i]，因为你的测试语句中已经执行了
//       // 此时值需要收集好就可以了
//       children.push(c[i]);
//     }
//     // 循环结束，就说明children手机完毕，此时就可以返回虚拟节点了
//     return vnode(sel, data, children, undefined, undefined);
//   } else if (typeof c === 'object' && c.hasOwnProperty('sel')) {
//     // 只有一个对象，直接放到数组中
//     let children = [c];
//     return vnode(sel, data, children, undefined, undefined);
//   } else {
//     throw new Error('参数类型异常')
//   }
// }


export default function (sel, data, c) {
  if (arguments.length !== 3) {
    throw new Error('参数必须传入三个')
  }

  if (typeof c == 'string' || typeof c == 'number') {
    return vnode(sel, data, undefined, c, undefined);
  } else if (Array.isArray(c)) {
    for (const item of c) {
      if (!(typeof item == 'object' && item.hasOwnProperty('sel'))) throw new Error('参数必须传入三个')
    }
    return vnode(sel, data, c, undefined, undefined);
  } else if (typeof c == 'object' && c.hasOwnProperty('sel')) {
    return vnode(sel, data, [c], undefined, undefined);
  } else {
    throw new Error('参数错误');
  }
}